package cn.iocoder.boot.redis;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.List;

/**
 * CacheService 是一个缓存服务类，旨在结合 Redis 和布谷鸟过滤器来优化缓存操作，特别是在防止缓存穿透方面。
 * 缓存穿透是指查询一个不存在的数据，由于缓存中没有，每次查询都会击穿缓存，直接查询数据库，这可能会导致数据库压力过大。
 * 该类通过使用 RedisCuckooFilter 来预先判断数据是否存在，从而避免了对不存在数据的数据库查询。
 */
public class CacheService {
    private RedisCuckooFilter redisCuckooFilter;
    private JedisPool jedisPool;

    /**
     * 构造函数，初始化 CacheService。
     */
    public CacheService(String host, int port) {
        redisCuckooFilter = new RedisCuckooFilter(host, port);
        jedisPool = new JedisPool(host, port);
    }

    /**
     * 初始化数据，向 Redis 中添加一批数据，并在 RedisCuckooFilter 中注册这些数据的存在。
     */
    public void initData(String key, List<String> items) {
        redisCuckooFilter.createFilter(key, items.size());
        for (String item : items) {
            redisCuckooFilter.addItem(key, item);
        }
    }

    /**
     * 获取缓存中的数据项。
     * @return 如果数据项存在于缓存中，则返回其值，否则返回 null
     */
    public String getItem(String key, String item) {
        // 首先检查数据项是否存在于布谷鸟过滤器中
        if (!redisCuckooFilter.existsItem(key, item)) {
            return null;
        }
        try (Jedis jedis = jedisPool.getResource()) {
            // 如果存在于过滤器中，则从 Redis 中获取数据
            return jedis.get(item);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}





